home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Windows Expert
/
Windows Expert.iso
/
windownt
/
uniput.zip
/
UNIPUT.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-10-26
|
16KB
|
538 lines
/**************************************************************************\
* uniput.c -- input of unicode characters.
*
* Steve Firebaugh
* Microsoft Developer Support
* Copyright (c) 1992 Microsoft Corporation
*
\**************************************************************************/
#define UNICODE
#include <windows.h>
#include <commdlg.h>
#include "uniput.h"
/* Misc. defines for size, color, and appearance of drawing. */
#define GRIDCOLOR PALETTEINDEX (6)
#define TICKSPACE 20
#define FWW_STEPS 40
HANDLE hFile = INVALID_HANDLE_VALUE;
HANDLE OpenNewFile(HWND);
TCHAR szHelpPathName[] = TEXT("uniput.HLP");
HANDLE hInst;
HWND hwndMain;
HWND hwndClient;
HWND hwndStatus;
int gShowhex, gShowNames;
#define STATUSHEIGHT 2*GetSystemMetrics(SM_CYMENU)
/**************************************************************************\
*
* function: WinMain()
*
* input parameters: c.f. generic sample
*
\**************************************************************************/
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
CLIENTCREATESTRUCT clientcreate;
WNDCLASS wc;
UNREFERENCED_PARAMETER( lpCmdLine );
UNREFERENCED_PARAMETER( nCmdShow );
hInst = hInstance;
/* Check for previous instance. If none, then register class. */
if (!hPrevInstance) {
wc.style = NULL;
wc.lpfnWndProc = (WNDPROC)MainWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon(hInstance, TEXT("uniputIcon"));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = NULL;
wc.lpszMenuName = TEXT("uniputMenu");
wc.lpszClassName = TEXT("uniput");
if (!RegisterClass(&wc)) return (FALSE);
} /* class registered o.k. */
/* Create the main window. Return false if CreateWindow() fails */
hwndMain = CreateWindow(
TEXT("uniput"),
TEXT("Input unicode characters"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL, NULL, hInst, NULL);
if (!hwndMain) return (FALSE);
/* create the MDI "client" window. */
clientcreate.hWindowMenu = GetSubMenu(GetMenu(hwndMain),2);
clientcreate.idFirstChild = 1;
hwndClient = CreateWindow(
TEXT("MDICLIENT"),
NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | MDIS_ALLCHILDSTYLES,
0,0,0,0,
hwndMain, NULL, hInst, (LPVOID)&clientcreate);
if (!hwndClient) return (FALSE);
/* create status bar */
wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC)StatusWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInst;
wc.hIcon = NULL;
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockObject (LTGRAY_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("status");
if (!RegisterClass(&wc)) return (FALSE);
hwndStatus = CreateWindow(
TEXT("status"),
TEXT("status"),
WS_CHILD | WS_CLIPSIBLINGS | WS_VISIBLE | WS_BORDER,
0,0,
GetSystemMetrics(SM_CXFULLSCREEN),
STATUSHEIGHT,
hwndMain, NULL, hInst, 0);
if (!hwndStatus) return (FALSE);
ShowWindow(hwndMain, SW_SHOWDEFAULT);
SetCursor (LoadCursor (NULL, IDC_WAIT));
/* Create the first child window showing glyphs. */
wc.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;
wc.lpfnWndProc = (WNDPROC)DisplayWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 12;
wc.hInstance = hInst;
wc.hIcon = LoadIcon(hInst, TEXT("uniputIcon"));
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = GetStockObject (WHITE_BRUSH);
wc.lpszMenuName = NULL;
wc.lpszClassName = TEXT("display");
if (!RegisterClass(&wc)) return (FALSE);
/* set the menus to be correct */
SendMessage (hwndMain, WM_COMMAND, IDM_SHOWHEX,0);
SendMessage (hwndMain, WM_COMMAND, IDM_SHOWNAMES,0);
/* Create one MDI child window to get started */
SendMessage (hwndMain, WM_COMMAND, IDM_NEWWINDOW, 0);
SetCursor (LoadCursor (NULL, IDC_ARROW));
/* Loop getting messages and dispatching them. */
while (GetMessage(&msg,NULL, NULL, NULL)) {
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}
/**************************************************************************\
*
* function: MainWndProc()
*
* input parameters: normal window procedure parameters.
*
\**************************************************************************/
LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HWND hwndActive;
switch (message) {
/**********************************************************************\
* WM_CREATE
\**********************************************************************/
case WM_CREATE: {
}
/**********************************************************************\
* WM_SIZE
*
* When the frame is sized, then change the size of the MDI client,
* excluding the status bar, and change the size and position of the
* status bar.
\**********************************************************************/
case WM_SIZE: {
RECT r;
GetClientRect (hwnd, &r);
r.bottom -= STATUSHEIGHT;
SetWindowPos (hwndClient, HWND_BOTTOM,
r.left, r.top, r.right, r.bottom, 0);
/* size & position status bar: left, right, & top just out of view */
SetWindowPos (hwndStatus, HWND_TOP,
r.left-1, r.bottom,
r.right+2, STATUSHEIGHT+1, 0);
return TRUE;
} break;
/**********************************************************************\
* WMU_CHARACTER
*
* global variable: hFile
*
* user message sent to main window when user hits a glyph square.
* if the main window has a file open, then write this unicode
* character to that file.
\**********************************************************************/
case WMU_CHARACTER: {
DWORD nBytes;
WCHAR tChar;
tChar = (WCHAR)lParam;
/* show it on the status bar */
SendMessage (hwndStatus, WMU_CHARACTER, 0, lParam);
if (hFile != INVALID_HANDLE_VALUE)
WriteFile (hFile, &tChar, sizeof(WCHAR), &nBytes, NULL);
} break;
/**********************************************************************\
* WM_COMMAND
*
\**********************************************************************/
case WM_COMMAND: {
switch (LOWORD(wParam)) {
/******************************************************************\
* WM_COMMAND, IDM_NEWWINDOW
*
* global - hwndClient, hInst
*
* Simply create a new MDI child window.
\******************************************************************/
case IDM_NEWWINDOW: {
HWND hwndDisplay;
hwndDisplay = CreateMDIWindow(
TEXT("display"),
TEXT("Display"),
WS_CHILD | WS_CLIPSIBLINGS | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_VISIBLE |
WS_CAPTION | WS_SYSMENU | WS_THICKFRAME | WS_HSCROLL,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
hwndClient, hInst, 0);
} break;
/******************************************************************\
* WM_COMMAND, IDM_NEWFILE
*
* global - hFile.
\******************************************************************/
case IDM_NEWFILE: {
DWORD nBytes;
hFile = OpenNewFile (hwnd);
/* Write the unicode byte order mark */
WriteFile (hFile, "\xFE\xFF", 2, &nBytes, NULL);
} break;
/******************************************************************\
* WM_COMMAND, IDM_CLOSEFILE
*
* global - hFile.
\******************************************************************/
case IDM_CLOSEFILE:
CloseHandle (hFile);
hFile = INVALID_HANDLE_VALUE;
SendMessage (hwndStatus, WMU_SETFILENAME, 0, (LPARAM)NULL);
break;
case IDM_HELP:
WinHelp( hwnd, szHelpPathName, HELP_INDEX, (DWORD) NULL );
break;
case IDM_ABOUT:
DialogBox (hInst, TEXT("aboutBox"), hwnd, (DLGPROC) About);
break;
/******************************************************************\
* WM_COMMAND, IDM_SHOWHEX
*
* Check menu on and off. Set global value: gShowHex
\******************************************************************/
case IDM_SHOWHEX:
if (GetMenuState (GetMenu (hwnd),IDM_SHOWHEX, MF_BYCOMMAND)
== MF_CHECKED) {
CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_UNCHECKED);
gShowhex = FALSE;
RedrawWindow (hwnd, NULL, NULL, RDW_INVALIDATE |RDW_ALLCHILDREN);
} else {
CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_CHECKED);
gShowhex = TRUE;
RedrawWindow (hwnd, NULL, NULL, RDW_INVALIDATE |RDW_ALLCHILDREN);
}
break;
/******************************************************************\
* WM_COMMAND, IDM_SHOWNAMES
*
* Check menu on and off. Set global value: gShowNames
\******************************************************************/
case IDM_SHOWNAMES:
if (GetMenuState (GetMenu (hwnd),IDM_SHOWNAMES, MF_BYCOMMAND)
== MF_CHECKED) {
CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_UNCHECKED);
gShowNames = FALSE;
} else {
CheckMenuItem(GetMenu (hwnd), LOWORD(wParam) , MF_CHECKED);
gShowNames = TRUE;
}
// PROBLEM: Need to send message to all child windows.
hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0);
SendMessage (hwndActive, WMU_NEWRANGE, 0,0);
InvalidateRect (hwndActive, NULL, TRUE);
break;
/******************************************************************\
* WM_COMMAND, IDM_CHAR*
*
* manage mutually exclusive menu indicating number of chars per line
\******************************************************************/
case IDM_CHAR10:
case IDM_CHAR16:
case IDM_CHAR20:
case IDM_CHAR32:
case IDM_CHAR40:
case IDM_CHAR64:
{ HMENU hMenu;
int nCharPerLine;
hMenu = GetMenu (hwnd);
CheckMenuItem(hMenu, IDM_CHAR10, MF_UNCHECKED);
CheckMenuItem(hMenu, IDM_CHAR16, MF_UNCHECKED);
CheckMenuItem(hMenu, IDM_CHAR20, MF_UNCHECKED);
CheckMenuItem(hMenu, IDM_CHAR32, MF_UNCHECKED);
CheckMenuItem(hMenu, IDM_CHAR40, MF_UNCHECKED);
CheckMenuItem(hMenu, IDM_CHAR64, MF_UNCHECKED);
CheckMenuItem(hMenu, LOWORD(wParam), MF_CHECKED);
/* notice the value is coded into the menu i.d. */
nCharPerLine = LOWORD(wParam)-IDM_CHARBASE;
hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0);
SendMessage (hwndActive, WMU_SETNCHAR, nCharPerLine ,0);
InvalidateRect (hwndActive, NULL, TRUE);
} break;
/******************************************************************\
* WM_COMMAND, IDM_FONT*
*
* manage mutually exclusive menu indicating font height
\******************************************************************/
case IDM_FONT18:
case IDM_FONT36:
case IDM_FONT72:
{ HMENU hMenu;
int Width, Height;
hMenu = GetMenu (hwnd);
CheckMenuItem(hMenu, IDM_FONT18, MF_UNCHECKED);
CheckMenuItem(hMenu, IDM_FONT36, MF_UNCHECKED);
CheckMenuItem(hMenu, IDM_FONT72, MF_UNCHECKED);
CheckMenuItem(hMenu, LOWORD(wParam), MF_CHECKED);
/* notice the value is coded into the menu i.d. */
Height = LOWORD(wParam)-IDM_FONTBASE;
/* scale the width proportionately */
Width = Height * UCFONTWIDTH/UCFONTHEIGHT;
hwndActive = (HWND)SendMessage (hwndClient, WM_MDIGETACTIVE, 0,0);
SendMessage (hwndActive, WMU_NEWFONT, (WPARAM)Width,(LPARAM)Height);
InvalidateRect (hwndActive, NULL, TRUE);
} break;
/******************************************************************\
* WM_COMMAND, IDM_MDI*
*
* misc. MDI responsibilities. hwndClient does real work.
\******************************************************************/
case IDM_MDICASCADE: SendMessage (hwndClient, WM_MDICASCADE, 0,0); break;
case IDM_MDITILE: SendMessage (hwndClient, WM_MDITILE, MDITILE_HORIZONTAL,0); break;
break;
} /* end switch */
} break; /* end WM_COMMAND */
/**********************************************************************\
* WM_DESTROY
\**********************************************************************/
case WM_DESTROY:
WinHelp( hwnd, szHelpPathName, (UINT) HELP_QUIT, (DWORD) NULL );
PostQuitMessage(0);
break;
default: break;
} /* end switch */
return (DefFrameProc(hwnd, hwndClient, message, wParam, lParam));
}
/***************************************************************************\
* FUNCTION: About
\***************************************************************************/
LRESULT CALLBACK About(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
if ((message == WM_COMMAND) && (LOWORD(wParam) == IDOK)) {
EndDialog (hwnd, TRUE);
return TRUE;
}
if ((message == WM_SYSCOMMAND) && (wParam == SC_CLOSE)) {
EndDialog (hwnd, TRUE);
return TRUE;
}
return FALSE;
}
/***************************************************************************\
*
* FUNCTION: OpenNewFile(HWND)
*
* PURPOSE: Invokes common dialog function to open a file and opens it.
*
\***************************************************************************/
HANDLE OpenNewFile( HWND hwnd )
{
TCHAR szFile[MAX_PATH],szFileTitle[MAX_PATH];
OPENFILENAME OpenFileName;
wsprintf (szFile, TEXT(""));
wsprintf (szFileTitle, TEXT(""));
OpenFileName.lStructSize = sizeof(OPENFILENAME);
OpenFileName.hwndOwner = hwnd;
OpenFileName.hInstance = (HANDLE) hInst;
OpenFileName.lpstrFilter = NULL;
OpenFileName.lpstrCustomFilter = NULL;
OpenFileName.nMaxCustFilter = 0L;
OpenFileName.nFilterIndex = 1L;
OpenFileName.lpstrFile = szFile;
OpenFileName.nMaxFile = sizeof(szFile);
OpenFileName.lpstrFileTitle = szFileTitle;
OpenFileName.nMaxFileTitle = sizeof(szFileTitle);
OpenFileName.lpstrInitialDir = NULL;
OpenFileName.lpstrTitle = TEXT("Open a File");
OpenFileName.nFileOffset = 0;
OpenFileName.nFileExtension = 0;
OpenFileName.lpstrDefExt = NULL;
OpenFileName.lCustData = 0;
OpenFileName.Flags = OFN_HIDEREADONLY;
if (!GetOpenFileName(&OpenFileName)) return INVALID_HANDLE_VALUE;
/* update status bar with the file title. */
SendMessage (hwndStatus, WMU_SETFILENAME, 0, (LPARAM)OpenFileName.lpstrFileTitle);
return (CreateFile(OpenFileName.lpstrFile,
GENERIC_WRITE,
0,
NULL,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL));
}